package main

import (
	"net/http"

	"github.com/gin-gonic/gin"
)

type Todo struct {
	ID          string `json:"id"`
	Title       string `json:"title"`
	Description string `json:"description"`
}

var todos = []Todo{
	{ID: "1", Title: "First todo", Description: "one day come here"},
	{ID: "2", Title: "Second todo", Description: "one day come here"},
}

func getTodos(c *gin.Context) {
	c.IndentedJSON(http.StatusOK, todos)
}

func getTodo(c *gin.Context) {
	id := c.Param("id")
	for _, todo := range todos {
		if todo.ID == id {
			c.IndentedJSON(http.StatusOK, todo)
			return
		}
	}
	c.IndentedJSON(http.StatusNotFound, gin.H{
		"msg": "No such todo",
	})
}

func postTodo(c *gin.Context) {
	var newTodo Todo
	if err := c.BindJSON(&newTodo); err != nil {
		return
	}
	todos = append(todos, newTodo)
	c.IndentedJSON(http.StatusCreated, newTodo)
}

func RemoveIndex(arr []Todo, index int) []Todo {
	return append(arr[:index], arr[index+1:]...)
}

func deleteTodo(c *gin.Context) {
	id := c.Param("id")
	for i, todo := range todos {
		if todo.ID == id {
			todos = RemoveIndex(todos, i)
			return
		}
	}
	c.IndentedJSON(http.StatusNotFound, gin.H{
		"msg": "no such todo",
	})
}

func updateTodo(c *gin.Context) {
	var updateTodo Todo
	id := c.Param("id")

	if err := c.BindJSON(&updateTodo); err != nil {
		return
	}

	for i, todo := range todos {
		if todo.ID == id {
			todos[i] = updateTodo
			c.IndentedJSON(http.StatusOK, todos[i])
			return
		}
	}
	c.IndentedJSON(http.StatusNotFound, gin.H{
		"msg": "No such todo",
	})

}

func main() {
	r := gin.Default()
	r.GET("/", func(c *gin.Context) {
		c.JSON(http.StatusOK, gin.H{
			"msg": "hello world",
		})
	})
	r.GET("/todos", getTodos)
	r.GET("/todo/:id", getTodo)
	r.POST("/todos/", postTodo)
	r.DELETE("/todos/:id", deleteTodo)
	r.PUT("/todos/:id", updateTodo)
	r.Run()
}
